package com.wd.study.pattern.template;

/**
 * 抽象快递员类<BR>
 *
 * @author w4425
 * @version [V2.0.0, 2021/3/9]
 * @since V2.0.0
 */
public abstract class Postman {
    /**
     * 派送流程 ， final 不希望子类更改
     */
    public final void post() {
        prepare();
        call();
        if (isSign()) {
            sign();
        } else {
            refuse();
        }
    }

    /**
     * 准备操作，固定流程 父类实现「普通方法」
     */
    protected void prepare() {
        System.out.println("快递已到达 准备派送");
    }

    /**
     * 联系收货人，联系人不一样，所以为「抽象方法」，子类实现
     */
    protected abstract void call();

    /**
     * 是否签收,这个是「钩子方法」，用来控制流程的走向
     *
     * @return 默认true
     */
    protected boolean isSign() {
        return true;
    }

    /**
     * 签收，这个是固定流程，父类实现
     */
    protected void sign() {
        System.out.println("客户已签收，上报系统");
    }

    /**
     * 拒签，空实现，这个也是「钩子方法」，子类可以跟进实际来决定是否去实现这个方法
     */
    protected void refuse() {

    }

}
